package exercises.leetcode;

/**
 * <a href="https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/">
 * 430. 扁平化多级双向链表</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 多级双向链表中，除了指向下一个节点和前一个节点指针之外，它还有一个子链表指针，可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项，依此类推，生成多级数据结构，如下面的示例所示。
 * <p>
 * 给你位于列表第一级的头节点，请你扁平化列表，使所有结点出现在单级双链表中。
 *
 * @author or2
 * @date 2021年09月24日 时间: 17:05
 */
public class No430 {
    public Node flatten(Node head) {
        Node p = head;
        while (p != null) {
            if (p.child != null) {
                Node nextP = p.next;
                p.child.prev = p;
                p.next = p.child;
                p.child = null;
                /*迭代处理*/
                Node next = p.next;
                while (p.next != null) p = p.next;
                p.next = nextP;
                if (nextP != null) nextP.prev = p;
                /*继续处理*/
                p = next;
            } else {
                p = p.next;
            }
        }

        return head;
    }

    private static class Node {
        public int val;
        public Node prev;
        public Node next;
        public Node child;
    }
}
